21 附录(Appendices)
21.1 附录 A:使用 LeCroy 工具调试 PCIe 流量
Christopher Webb,LeCroy 公司
21.1.1 概述
I/O 总线架构从 PCI 向 PCI Express 的过渡,对开发人员在验证和调试所需工具类型方面产生了重大影响。
对于 PCI 这类并行总线,信号的波形视图能为开发者提供足够信息来解读总线状态。用户可通过目视检查波形,在脑中解码事务类型、传输数据量,甚至传输内容本身。
由于 PCI Express 包流量经过编码和加扰处理,查看流量波形视图几乎无法获取链路状态信息。虽然可通过位时间宽度推断链路速率,通过有效通道数量推断链路宽度,但用户无法通过目视解读符号对齐方式,更遑论数据包本身。
为帮助开发者可视化串行链路状态,新型工具应运而生。这些工具可自动完成解串行化、解码和解扰操作。乍看之下这似乎已能满足开发者需求。但针对 PCI Express,这些工具还需理解流量控制信用值、通道间偏移、极性反转及通道反转等复杂机制,才能完整解析 PCIe 协议。
硅前与硅后调试都共同需要工具的支持。在本附录章节中,我们将从硅前与硅后两个角度,介绍一些可用于调试 PCI Express 互连的产品方案。
21.1.2 硅前调试
21.1.2.1 RTL 仿真视角
在 RTL 仿真中,查看 FPGA 或 ASIC 信号的波形视图是最常见的调试方式。通过展示内部状态机状态、监控数据在器件中传输时的 I/O 信号,或观察控制信号的状态,波形视图具有强大的功能。但如前所述,PCI Express 链路以波形形式呈现时难以理解。必须进行额外的处理或解码才能解析这种新型链路。为增强仿真工具的能力,通常需要添加 PCI Express 总线监视器来满足这一需求。
21.1.2.2 PCI Express RTL 总线监视器
PCI Express 总线监视器是一段用户插入其 RTL 仿真中的代码,用于帮助监控其 PCIe 链路的状态。该监视器至少会输出基于文本的日志文件,其中包含链路状态变化和数据包活动类型的信息。更复杂的监视器会执行实时合规性检查。多家供应商提供可购买的 IP,用于实现这一确切功能。然而,重点通常在于合规性。在流量控制信用、链路利用率或链路训练调试等可视化方面,提供的功能较少。
21.1.2.3 RTL 向量导出至 PETracer 应用程序
LeCroy 已与多家领先的 PCIe 验证 IP 供应商合作,创建工具以进一步增强硅前 PCIe 流量的可视化和分析能力。这涉及使用供应商的总线监视器将原始符号流量导出至与专用 PCIe 分析仪硬件相同的 PETracer 应用程序中。SimPASS PE 是 LeCroy 支持此类导出的解决方案。
关于 LeCroy 的 PETracer 应用及其功能的更多信息,请参见后文“使用 PETracer 应用程序查看流量”一节。
21.1.3 硅后调试
21.1.3.1 示波器
使用示波器调试 PCIe 链路通常侧重于链路的电气验证。最常见的用途是检查带有掩模叠加的眼图,以确定电气合规性。一个较少为人知的合规性检查是观察电气空闲状态的进入和退出,以确认链路在传输电气空闲有序集后,是否在规定时间内达到共模电压。这是两个 PCIe 合规性检查的示例,最好使用如图 1(第 920 页)所示的示波器来执行。
随着 8.0 GT/s 操作中动态链路训练的加入,设备现在必须在 Recovery.EQ LTSSM 子状态下训练发射器均衡。其目标是设置发射器均衡,以便为接收器提供最佳信号眼图。监测这一动态均衡过程是示波器强大功能的又一例证。使用实时示波器,用户可以捕获这一过程,并观察发射器设置变化对波形的影响。这不仅使用户能够验证发射器是否确实响应了系数变更请求,还能判断接收器是否正确选择了合适的设置。
对于链路的逻辑调试,当链路为 x1 或 x2 时,示波器最为有用,因为此时受限于示波器可采集的通道数量。检查 PCIe 流量的第一种方法是波形视图。与 RTL 波形查看器类似,如果没有软件辅助执行 8b/10b 解码和解扰,很难理解链路的状态。幸运的是,更先进的示波器配备了执行这些功能的软件包。为了使其正常工作,示波器必须具有深度捕获缓冲区,并且必须看到 SKIP 有序集,以便它们能够解读字节对齐并同步解扰器 LFSR。
LeCroy 示波器可以将 PCIe 符号叠加在波形上,以增强流量的可视性。屏幕上还可以显示基于文本的包符号列表,作为检查波形的另一种方法。
力科(LeCroy)近期为其示波器产品线推出一款名为 ProtoSync 的软件包,用户可通过该软件将捕获的波形导出至 PETracer 应用程序。该软件包与协议分析仪使用的软件包相同,具备下文所述的一系列强大后处理功能。PETracer 软件可独立运行于示波器硬件上(通常显示在第二台显示器上),从而支持将示波器波形呈现的物理层数据与 PETracer 软件呈现的逻辑层数据进行时间关联对比。
在示波器上捕获 8.0 GT/s 动态链路均衡过程,并将该流量导出至 PETracer 应用程序,是该解决方案最具代表性的应用场景。用户可在 PETracer 中定位至发送 TX 系数变更请求的链路训练数据包,随后在示波器软件中识别该系数变更的应用位置。通过此操作,用户可测量系数变更生效所需的时间,并与 PCIe 规范要求的时序参数进行对比。
图 A-1:配备 ProtoSync 软件选项的 LeCroy 示波器
21.1.3.2 协议分析仪
调试 PCIe 链路的一个日益流行的趋势是使用专用的协议分析工具。协议分析仪与逻辑分析仪的区别在于,它是为支持特定协议(如 PCIe)而构建的。从硬件角度来看,PCIe 协议分析仪针对采集和存储 PCIe 流量进行了优化。这一优化从专用的 PCIe 插槽探针开始,延续到线缆选择,并贯穿至内部硬件组件。为了恢复 PCIe 流量,使用了专门的时钟与数据恢复电路,这些电路能够处理电气空闲转换、扩频调制, 以及 128b/130b 编码中的运行长度。在解串之前,采用复杂的均衡电路来恢复信号眼图。如果不理解 PCIe 恢复的复杂性,分析仪硬件就无法针对恢复复杂流量(如速率切换、动态链路宽度以及 L0s 等低功耗状态)进行优化。
除了为恢复 PCIe 流量选择合适的硬件组件外,协议分析仪还包含专门针对 PCIe 的逻辑电路。这些逻辑必须推断 PCIe 链路的状态,并在各种 LTSSM 状态变化期间对其进行跟踪。一旦链路状态被正确跟踪,专用的包检测电路会对传入包进行数据匹配,以查找用户编程的事件。这些匹配器用于流量过滤以及执行停止流量捕获所需的触发功能。通过结合这些流量过滤器和大容量跟踪缓冲区(通常为 4GB 至 8GB),用户可以捕获比不使用协议分析仪时更长的流量场景。
最后,协议分析仪最重要的部分是软件图形用户界面(GUI)。通过使用专用的 PCI Express 软件工具优化流量视图、后处理报告和硬件控制,可以执行一套非常全面的 PCI Express 特定分析。
21.1.3.3 逻辑分析仪
有些逻辑分析仪提供专用于 PCIe 的软件包。这类软件会读取逻辑分析仪硬件捕获的 PCI Express 数据,并对这些数据进行一定程度的后处理。分析内容包括解码、解扰以及流量解码等基础操作。然而,这些软件工具并不具备专用协议分析仪软件所提供的丰富后处理功能。
21.1.4 使用协议分析仪的探测选项
要记录 PCIe 流量,首先需要找到最佳的探测方法。PCIe 最初以台式电脑和服务器的附加卡形式出现,但此后已扩展到各种标准和非标准的外形规格。对于标准外形规格,最佳的探测选项是专用的插卡式探头。
转接板(Interposer)是一种专用硬件,包含用于将 PCIe 流量副本传输至分析仪硬件以进行捕获和分析的探测电路。这些转接板专为其所处的机械和电气环境而设计。最常见的转接板是“插槽转接板”,如图 2(第 922 页)所示。该转接板用于探测符合标准 CEM 规范的 PCIe 附加卡。
在选择转接板时应格外谨慎,因为探测电路因供应商不同以及 PCIe 最大链路速度的要求而异。例如,Gen3 插槽转接板应包含允许动态链路训练过程正常通过探头的探测电路。LeCroy Gen3 插槽转接板采用线性电路,以保持波形在通过探头时的形状。这使得发射器的预加重能够在链路训练期间动态变化,同时允许接收器量化新设置的影响(无论是正面还是负面影响)。
图 A-2:LeCroy PCI Express 插槽转接板 x16
力科还提供一系列其他专用转接板,适用于 ExpressCard、XMC、Mini Card、Express Module、AMC 等规格。其中部分转接板如图 3(第 923 页)所示。如需完整列表,请访问 LeCroy 官网:www.lecroy.com,该列表持续更新中。
图 A-3:力科 XMC、AMC 及 Mini Card 转接板
对于无法使用专用转接板进行调试的 PCIe 链路,图 4(第 923 页)所示的中总线探头是次优选择。中总线探头需在 PCB 上放置行业标准探头几何结构。每条 PCIe 通道均被路由至焊盘上的对应触点,可通过中总线探头进行探测。此类探头采用弹簧针或 C 型夹,实现被测系统与协议分析仪之间的免焊机械连接。
图 A-4:LeCroy PCI Express Gen3 中总线探头
作为最后的手段,可以使用图 5(第 924 页)所示的飞线探头将协议分析仪连接到被测系统。这需要将电阻分接电路和连接器引脚焊接到 PCIe 走线上。该电路通常焊接在 PCIe 链路的交流耦合电容上,因为这些电容通常是唯一能接触到走线的位置。一旦探头电路焊接到 PCB 上,即可根据需要连接和移除分析仪探头。这种方法几乎适用于任何 PCIe 链路,但连接的可靠性取决于添加探头的技术人员的技术水平。
图 A-5:LeCroy PCI Express Gen2 飞线探头
21.1.5 使用 PETracer 应用程序查看流量
21.1.5.1 CATC Trace Viewer
使用 LeCroy PETracer 应用程序查看 PCI Express 流量的主要方式是 CATC Trace 视图。该视图将每个记录的包分解为不同的包字段,以突出显示该包中包含的重要数值。通过颜色和文本的组合,对每个包进行视觉分类并解释其用途。错误以红色高亮显示,如图 6(第 925 页)所示。警告以黄色高亮显示,便于识别流量中或包内不符合规范的字段区域。
图 A-6:带有 ECRC 错误的 TLP 包
除了对每个数据包进行解码和可视化分解外,分层显示功能还允许对相关数据包进行逻辑分组。例如,在”链路层”模式下,TLP 会与其对应的 ACK 数据包分组显示。每个 TLP 会被标识为隐式或显式确认(ACK)或否定确认(NAK)。图 7(第 925 页)展示了一个 ACK DLLP 示例及其所确认的 TLP。
图 A-7:“链路层”将 TLP 与其链路层响应分组
在““Split-Level”模式(如图 8 第 926 页所示)中,CATC Trace 视图将分裂事务合并显示。例如,单个 TLP 读取操作可与一个或多个完成 TLP 分组,从而在跟踪中以单行形式逻辑展示大数据传输。每个分层事务均提供数据量、起始地址及性能指标。这使得用户无需关注大内存事务如何拆分为多个 TLP 的细节,而能专注于数据内容本身。若用户希望查看分裂事务的详细信息,分层显示可展示构成该分裂事务的所有数据包的链路层和/或数据包层分解。这种“逐级下钻”的流量分析方法允许用户从总线活动的高层视图入手,仅针对感兴趣的流量区域进行深入分析。
图 A-8:“Split-Level”将完成包与关联的非发布请求分组
CATC Trace 视图还支持“Compact View”,如图 9(第 927 页)所示。在此视图中,重复发送的数据包会被折叠为单个单元格。这对于折叠训练序列或流控制初始化数据包非常有用。执行此折叠操作的软件算法足够智能,也能折叠任何 SKIP 有序集。这创建了链路训练过程的非常紧凑的视图,使用户无需滚动浏览数百个数据包即可检查链路训练数据包的变化。
图 A-9:“Compact View”折叠相关数据包,便于查看链路训练
21.1.5.2 LTSSM 图表
为了进一步增强“逐级下钻”的流量查看方式,PETracer 应用程序包含一个 LTSSM 图形视图,如图 10 所示(第 928 页)。当调用此图形时,软件会解析跟踪数据以查找链路训练部分,并推断链路训练与状态状态机(LTSSM)的状态。结果生成一个以高层视图分解 LTSSM 状态转换的图形。该图形使用户能够立即查看链路是否进入恢复状态。如果是,用户可以轻松识别是链路的哪一侧发起了恢复、进入恢复的次数,甚至恢复是否导致链路速度或链路宽度降低。
LTSSM 图形也是一个指向跟踪文件的活动链接。例如,如果用户点击进入恢复的条目,跟踪文件将导航到该位置。这将使用户能够查看恢复是否由重复的 NAK 引起,或由于其他原因(如块对齐丢失)导致。
简而言之,当用户调试与链路训练、速率变化或低功耗状态转换相关的问题时,LTSSM 会受到影响。通过查看 LTSSM 图,用户可以轻松识别这些链路状态变化是否发生、发生在何处,并直接导航至该位置以进行更快速的分析。
图 A-10:LTSSM 图显示整个跟踪中的链路状态转换
21.1.5.3 流量控制信用跟踪
流量控制信用跟踪在 PCI Express 中尤其棘手。流量控制更新数据包并不显示每个端点拥有的信用数量,而是显示总共已使用了多少信用。这意味着每个端点必须为每种类型维护一个运行中的信用计数器。在某些情况下,信用可能会丢失,如果发生这种情况,链路最终将因信用不足而无法传输数据。此类问题非常难以识别和调试。
LeCroy PETracer 应用程序提供了一个信用跟踪软件工具,如图 11(第 929 页)所示,用于辅助调试。如果跟踪数据包含 FC-Init 数据包,该工具将遍历跟踪数据,并在每个 TLP 和 FC-Update 之后显示每个虚拟通道缓冲区类型的剩余信用量。
FC-Init 数据包在链路训练后仅发送一次。因此,PETracer 应用程序允许用户在跟踪数据中的某个点设置初始信用值, 软件将计算剩余数据包的相对信用值。即使初始信用值由用户设置不当,能够查看相对信用值通常也足以发现流量控制问题。
图 A-11:流量控制信用跟踪
21.1.5.4 BitTracer
某些调试场景无法通过逐级下钻检查流量来解决。例如,当链路设置错误时,录制的数据通常无法读取。如果设备未能正确加扰流量,或者 10 位符号以相反顺序发送,又该如何处理?针对这种情况,需要一种能够聚焦于示波器波形视图与 CATC Trace 视图之间分析的工具。这正是第 930 页图 12 所示的 BitTracer 视图最强大的应用场景。
BitTracer 视图允许用户查看链路上原始流量的真实形态。该软件支持用户以 10 位符号、加扰字节或未加扰字节的形式查看流量。无效符号和错误的运行差异(Running Disparity)将以红色高亮显示。
为了进一步确定流量可能存在的问题,BitTracer 工具提供了一系列强大的后处理功能,可对流量进行修改。例如,在捕获后,用户可以反转某个通道的极性。应用该功能后,用户可以查看 10 位符号是否在跟踪中正确显示。如果这能清理跟踪数据,则表明需要更改分析仪硬件的记录设置。
图 A-12:Gen2 流量的 BitTracer 视图
此外,还可以修改通道顺序。这对于判断通道反转是否导致捕获不良非常有用。如果流量存在过大的通道间偏移,BitTracer 软件允许用户重新对齐流量。对于 Gen3 流量,这种偏移可以逐位应用。这本质上允许用户在捕获后修复 130 位块的对齐问题。
对数据应用更改后,可以将全部或部分数据导出为标准 CATC Trace 视图,以便进行更高级别的分析。在早期启动调试底层问题时,这一工作流程非常强大。例如,假设用户的设备正确训练了链路,然后突然对 1 条通道应用极性反转。这明显违反了规范,将导致链路重新训练。如果使用 BitTracer 工具捕获此流量,用户可以轻松识别出该问题。此外,极性反转前后的流量部分可以导出为单独的跟踪文件,并在 CATC Trace 视图中进行检查。
21.1.5.5 分析概述
如您所见,不同的流量视图有助于调试某些故障情况。LeCroy 支持将来自多种来源的 PCIe 流量导入其高度复杂的 PETracer 软件中。无论是 RTL 仿真、示波器捕获还是专用协议分析仪捕获,PETracer 都提供丰富的流量视图和报告,使用户能够最佳地了解其 PCIe 链路的健康状况和状态。
21.1.6 流量生成
21.1.6.1 硅前验证阶段
在仿真环境中激励 PCI Express 端点时,可从多家供应商处购买专用验证 IP。该 IP 将测试基本功能并执行多项 PCIe 合规性检查。对于 ASIC 开发者而言,在流片前发现并修复这些问题显然至关重要,这正是此类工具的价值所在。若 PCIe 设计在掩模成本不构成问题的 FPGA 中实现,则使用专用流量生成工具(如 LeCroy PETrainer 或 LeCroy PTC 卡)在硬件中执行合规性检查可能更具成本效益。
21.1.6.2 后硅验证阶段
21.1.6.2.1 测试卡
为了在芯片硅后全面测试 PCIe 设计的合规性和整体稳健性,需要使用专用的Exerciser 卡,例如图 13(第 932 页)所示的 LeCroy PETrainer。该卡允许用户生成各种合规与非合规的流量。例如,如果将 PCIe 卡插入标准主板,其所能看到的 TLP 大小可能会受到限制。而专用Exerciser 卡能够生成整个合法数据包大小范围内的 TLP。
其次,若要测试某张卡在收到带有错误 LCRC 的 TLP 时是否发出 NAK 信号,将该卡连接至合规设备是无法实现的——合规设备不会发送错误数据包。Exerciser 卡则可以生成带有错误 LCRC、错误标头值或以 EDB 符号结尾的 TLP。
若需测试您的卡在收到 NAK 时能否正确重发数据包,同样可通过训练器实现。例如,您可能希望对某个 TLP 连续发出 4 次 NAK 以触发链路恢复。这些行为在Exerciser 卡中编程实现都相当简便。
测试用例和故障场景的数量仅受限于您编写的脚本数量。一旦编写完成,这些脚本可重复用于测试设计的新版本。分析器软件能够记录这些会话,并通过脚本判断设备响应是否正确。许多 LeCroy 客户已利用这些工具创建了庞大的回归测试库。
图 A-13:LeCroy Gen3 PETrainer Exerciser 卡
21.1.6.2.2 PTC 卡
PCI-SIG 已发布一份具体的合规性测试清单,所有”合规”设备必须通过该测试。LeCroy 协议测试卡(PTC)是 PCI-SIG 合规性研讨会上用于执行这些测试的硬件设备。用户可从力科购买如图 14(第 933 页)所示的 PTC 卡,用于预先测试其设备,确保能够通过 PCI-SIG 合规性认证。
LeCroy PTC 用于测试 x1 链路宽度下的根复合体或端点设备。链路速度可支持 Gen1 或 Gen2。
图 A-14:LeCroy Gen2 协议测试卡 (PTC)
21.1.7 结论
如今,PCIe 开发者可借助多种工具来调试其 PCIe 设计。得益于 PCIe 标准的广泛采用,其中许多工具专为 PCIe 调试而设计,并包含应对众多 PCIe 设备所面临挑战的功能特性。
有关 LeCroy PCIe 工具产品的更多信息,请访问 LeCroy 网站 www.lecroy.com
21.2 附录 B:PCI Express 的市场与应用
Akber Kazmi(PLX Technology, Inc. 市场高级总监)
21.2.1 引言
自 20 世纪 90 年代初定义以来,PCI 已成为计算机领域最成功的互连技术。该架构最初面向个人计算机系统,现已扩展至几乎所有计算平台类别,包括服务器、存储、通信以及广泛的嵌入式控制应用。最重要的是,PCI 总线速度和宽度的每一次进步都保持了向后兼容性。
尽管 PCI 架构取得了巨大成功,但多点并行共享总线互连技术所能实现的功能仍存在局限性。诸多问题——时钟偏移、高引脚数、印刷电路板(PCB)走线布线限制、带宽与延迟要求、物理可扩展性,以及系统内为支持各类应用而需实现的服务质量(QoS)——最终催生了 PCI Express (PCIe)架构的定义。
PCIe 是 PCI 的自然演进产物,其开发旨在提供采用基于数据包的分层架构、具备先进高速串行互连技术优势的同时,保持与庞大 PCI 软件基础设施的向后兼容性。核心目标是为未来各类平台(包括台式机、服务器、工作站、存储设备、通信设备及嵌入式系统)提供优化的通用互连解决方案。
自 2001 年问世以来,PCIe 已历经三代技术升级。第一代(Gen1)信号速率设定为 2.5 GT/s,随后提升至 5.0 GT/s(Gen2),最终达到 8.0 GT/s(Gen3)。PCIe 规范允许将 2、4、8、12、16 或 32 条通道合并至单个端口,但当前市售产品尚未支持 12 通道与 32 通道宽端口。值得注意的是,所有 PCIe Gen2 和 Gen3 设备均需在速率上保持与前代产品的向后兼容性。
行业已推出并全面采用 PCIe Gen3 产品,同时 PCI 特别兴趣小组(PCI-SIG)正在分析 Gen4 的信号速率(速度)。PCIe Gen4 的目标是将 Gen3 的速度提升一倍,达到 16 GT/s。
PCIe 交换机提供多种规格,通道数从 3 到 96 不等,端口数从 3 到 24 个,每个端口可配置为 1、2、4、8 或 16 通道宽度。Gen3 单通道每个方向可提供约 1 GB/s 带宽,而 16 通道端口在每个方向上可提供 16GB 带宽。此外,PLX Technology 等 PCIe 交换机供应商在其产品中增加了 PCIe 规范未涵盖的功能和增强特性,从而形成产品差异化,并为系统设计人员创造附加价值。这些功能可带来易用性、更高性能、故障切换、错误检测、错误隔离及现场可升级性。
芯片上的特性包括非透明桥接(NT bridging)、点对点通信、热插拔(Hot-Plug)、直接内存访问(DMA)以及错误检查与恢复。此外,调试功能如数据包生成、接收端眼图测量、流量监控以及实时流量中的错误注入,为设计人员提供了重要价值,有助于早期系统启动。其中许多功能还可用于运行时性能优化与监控。
下一代 PCIe 交换机包含的特性包括:
非透明桥接:允许两个主机/CPU 连接到同一 PCIe 交换机,同时保持电气和逻辑隔离。非透明桥接功能广泛应用于需要隔离两个活动 CPU 或一个活动 CPU 与一个被动 CPU 的系统。非透明功能支持两个主机 CPU 之间交换心跳信号,以便在其中一个发生故障时实现故障切换。
DMA:PCIe 交换机中的片上 DMA 控制器为设计人员提供了重要价值,使其能够节省 CPU 周期,用于在设备之间以及 CPU 与 I/O 之间传输数据。CPU 在数据传输方面的工作量减少,从而提升了系统的整体性能,因为节省出的 CPU 周期可用于运行应用程序,而非管理数据 I/O。
错误隔离:用户可以针对特定错误事件及交换机的响应进行触发编程。交换机的响应也可设置为忽略、触发主机中断、关闭出现错误的端口,或完全关闭整个交换机。
数据包生成:通常,在不使用昂贵的数据包生成器设备的情况下,很难生成能够使 PCIe 端口饱和的流量。如今,PCIe 交换机能够以所需流量(如事务层数据包)使任何 PCIe 端口饱和,从而检查系统的性能和稳健性。
21.2.2 PCI Express I/O 虚拟化解决方案
PCIe 技术最初被定义为单主机互连技术,但近年来已开发出新的标准,使其适用于多主机系统,成为数据中心和企业 IT 应用的交换结构技术。由于 x86 CPU 和服务器平台具备原生 PCIe 接口(端口),设计人员得以将 PCIe 用作中小型服务器集群的背板和结构技术。
2007 年,PCI-SIG 发布了单根 I/O 虚拟化(SR-IOV)规范,该规范支持在 PCIe 系统中,将单个物理资源(如网卡或主机总线适配器)共享给同一主机上运行的多个虚拟机。这是在不同应用程序或虚拟机之间共享资源或 I/O 设备的最简单方法。
PCI-SIG 于 2008 年完成了多根 I/O 虚拟化(MR-IOV)规范的制定工作,该规范将 PCIe 技术的应用范围从单根域扩展至多根域。MR-IOV 规范支持多个主机和多个系统映像同时使用单个 I/O 设备,如图 0-1(第 938 页)所示。该示意图展示了一个多主机环境,其中支持 MR-IOV 的 NIC 和 HBA 通过 MR-IOV 交换机在多个服务器或虚拟机之间共享。
图 0-1:MR-IOV 交换机使用场景
为实现 MR-IOV 规范,需要开发系统的三个组件:MR-IOV PCIe 交换机、端点和管理软件。这三个组件必须同时可用且无缝协作。遗憾的是,在该规范制定四年后,仍没有任何一家芯片厂商推出支持 MR-IOV 的 PCIe 交换机或端点。PCIe 交换机厂商正通过厂商自定义功能并利用现有的 SR-IOV 端点,提供具备 MR-IOV 定义能力的解决方案。
21.2.3 多根(MR)PCIe 交换机解决方案
PCIe 交换机厂商已开发出通过非透明桥接和多根(MR)功能实现多主机功能的交换机。这些 MR 交换机允许多个主机连接到单个交换设备,用户可控制其分区方式,使每个主机连接到交换机所需的一组下游端口。
在 MR 交换机中,其中一个主机充当主控角色,将 I/O 分配给其他主机端口。每个主机独立于其他主机运行,并控制其域内的下游设备。第 939 页的图 0-2 展示了 MR 交换机的内部架构,其中特定下游端口组在管理控制下与特定主机端口相关联。
图 0-2:MR-IOV 交换机内部架构
21.2.4 超越芯片间互连的 PCIe
在 PCIe 部署的早期阶段,该技术被用作芯片间互连,但如今 CPU、芯片组和 IO 上 PCIe 接口的广泛可用性,以及这些组件的广泛采用,正推动其超越传统应用。在新一代应用中,PCIe 被用于系统背板、交换结构、布线系统、存储/I/O 扩展、IO 虚拟化、高性能计算(HPC)和服务器集群。第 940 页的图 0-3 展示了 PCIe 在数据中心中用于高性能计算应用的情况,其中机架内的服务器通过机顶(TOR)PCIe 交换结构机箱进行集群。TOR PCIe 交换机可通过以太网连接到网络,并通过 PCIe 链路连接到本地存储和计算资源。
机箱外部的 PCIe 连接依赖于行业领导者以更低成本推出的 PCIe 铜缆或光缆。PCIe TOR 结构适用于服务器/计算集群,并可能随着 PCIe 作为交换结构生态系统的壮大而取代 InfiniBand。
图 0-3:PCIe 在数据中心中用于 HPC 应用
21.2.5 SSD/存储 I/O 扩展箱
近年来,行业已趋向于将 PCIe 作为企业级存储和固态硬盘(SSD)应用的统一互连技术。行业联盟 NVM HCI 发布了名为 NVM Express(NVMe)的规范,该规范利用 PCIe 为 SSD 应用提供所需带宽。此外,T10 委员会已着手定义基于 PCIe 的 SCSI(SOP)协议,以利用 PCIe 技术能力实现高性能存储应用。同时,SATA 联盟近期宣布将采用 PCIe 作为其下一代 SATA 规范(称为 SATA Express,即 SATAe)的互连方案。
21.2.6 服务器 SSD 模块中的 PCIe
传统上,企业级 SSD 模块采用 SAS、SATA 和光纤通道接口,但基于上述发展,绝大多数 SSD 控制器、模块及系统供应商已推出采用 PCIe 接口的产品。大多数 SSD 控制器因管理闪存的高负载而达到性能与容量的峰值。在高性能应用中,多个 SSD 控制器(或 ASIC)通过 PCIe 交换机聚合使用。第 941 页图 0-4 展示了 PCIe 交换机在 SSD 附加卡中的基本应用,该应用适用于任何卡或模块形态。
图 0-4:PCIe 交换机在 SSD 附加卡中的应用
在大型数据中心应用中,SSD 附加卡安装在服务器主板上(如第 941 页图 0-5 所示),并通过 PCIe 交换机聚合至 I/O 扩展箱(图 6)。在服务器主板设计中,PCIe 交换机用于创建更多端口/插槽,以容纳额外的 SSD 模块,满足应用需求。
图 0-5:服务器主板使用 PCIe 交换机
除了提供连接功能外,PCIe 交换机还可通过 NT 桥接和 MR 功能实现冗余和故障切换。MR 交换机支持 1+N 故障切换能力,即一台服务器/主机与 N 台服务器通信以检测心跳信号,并在其中一台服务器发生故障时启动故障切换。图 0-6(第 942 页)中展示的其中一台服务器可在 1+N 故障切换方案中作为其他服务器的备份。
图 0-6:故障切换方案中的服务器故障切换
21.2.7 结论
PCIe 互连技术已成为许多高端应用中芯片间互连之外的有力竞争者,预计将用于外部 I/O 共享、服务器集群、I/O 扩展和 TOR 交换。当前 8 GT/s 和下一代(Gen4)16 GT/s 的线路速率、将多个通道聚合到单个高带宽端口的能力、故障切换功能、用于数据传输的嵌入式 DMA 以及 I/O 共享/虚拟化,提供了至少不逊色于(甚至优于)InfiniBand 和以太网等接口的能力。
21.3 附录 C:利用 PCI Express 技术实现智能适配器与多主机系统
Jack Regula, Danny Chi, Tim Canepa(PLX Technology 公司)
21.3.1 引言
智能适配器、主机故障切换机制和多处理器系统是当今常见的三种使用模式,并且随着下一代系统的市场需求,预计将变得更加普遍。尽管这些技术各自源于完全不同的市场需求,但它们都有一个共同要求:使用这些技术的系统需要多个处理器共存于同一系统中。本附录概述了 PCI Express 如何通过非透明桥接来满足这些需求。
由于采用智能适配器、主机故障切换和多主机技术的系统广泛流行,PCI Express 芯片供应商必须提供支持这些功能的手段。实际上,这是一项风险相对较低的工作;因为 PCI Express 在软件层面与 PCI 兼容,而 PCI 系统早已实现了分布式处理。最直接的方法——也是 PLX 所倡导的方法——是在 PCI Express 中模拟 PCI 领域最常用的实现方式。这一策略使系统设计者不仅能使用熟悉的实现方案,而且能采用经过验证的方法论。 在从 PCI 迁移到 PCI Express 的过程中,能够提供显著的软件复用性。本文概述了如何利用 PCI 范式中建立的行业标准实践来实现多处理器 PCI Express 系统。不过,我们首先将定义不同的使用模型,并回顾 PCI 社区在开发满足这些需求的机制方面取得的成功。最后,我们将介绍 PCI Express 系统如何利用非透明桥接来提供这类系统所需的功能。
21.3.2 使用模型
21.3.2.1 智能适配器
智能适配器通常是使用本地处理器来分担主机任务的周边设备。智能适配器的示例包括 RAID 控制器、调制解调器卡,以及执行安全处理和流量处理等任务的内容处理刀片。通常,这些任务要么计算量繁重,要么如果由主机执行则需要大量 I/O 带宽。通过在端点添加本地处理器,系统设计者可以获得显著的增量性能提升。在 RAID 市场中,大量产品利用本地智能进行 I/O 处理。
智能适配器的另一个例子是电子商务加速卡。由于通用主机处理器并未针对 SSL 所需的指数运算进行优化,使用主机处理器执行 SSL 握手通常会使系统性能下降超过 90%。此外,SSL 握手操作的要求之一是具备真正的随机数生成器。许多通用处理器并不具备此功能,因此实际上很难在没有专用硬件的情况下执行 SSL 握手。类似示例在智能适配器市场中比比皆是;事实上,这种使用模式非常普遍,以至于在许多应用中已成为事实上的标准实现方式。
21.3.2.2 主机故障切换
主机故障切换功能被设计用于需要高可用性的系统中。高可用性已成为日益重要的需求,尤其是在存储和通信平台中。确保整个系统持续运行的唯一可行方法是为关键组件提供冗余。
所有组件。主机故障切换系统通常包括一个基于主机的系统,该系统连接到多个端点。此外,一个备用主机连接到系统并被配置为监控系统状态。当主控主机发生故障时,备用主机处理器不仅必须识别故障,还必须采取措施接管主控制权,移除故障主机以防止进一步的中断,重建系统状态,并在不丢失任何数据的情况下继续系统运行。
21.3.2.3 多处理器系统
多处理器系统通过允许多个计算引擎同时处理复杂问题的不同部分,提供了更强的处理带宽。与采用主机故障切换(备用处理器基本处于空闲状态)的系统不同,多处理器系统利用所有引擎来提升计算吞吐量。这使得系统能够达到仅使用单个主机处理器无法实现的性能水平。多处理器系统通常由两个或更多完整的子系统组成,这些子系统之间可通过专用互连通道进行数据传递。刀片服务器机箱就是多主机系统的典型示例:每个刀片都是一个完整的子系统,通常配备独立的 CPU、直连存储和 I/O 接口。
21.3.3 基于 PCI 的多处理器实现发展史
要更好地理解针对 PCI Express 提出的实现方案,首先需要了解 PCI 的实现方式。
PCI 最初于 1992 年为个人计算机定义。由于当时个人计算机的特性,协议架构师并未预见到多处理器的需求。因此,他们设计系统时假设主处理器会枚举整个内存空间。显然,如果添加另一个处理器,系统操作将失败,因为两个处理器都会尝试处理系统请求。
随后发明了几种方法来满足使用 PCI 的多处理器能力需求。最流行的实现方式(也是本文针对 PCI Express 讨论的方式)是在处理子系统之间使用非透明桥接来隔离它们的内存空间。
由于主机在首次上电或复位时不知道系统拓扑结构,因此必须执行发现操作以了解存在哪些设备,然后将它们映射到内存空间中。为了支持标准的发现和配置软件,PCI 规范为兼容设备的控制和状态寄存器(CSR)定义了标准格式。标准的 PCI 到 PCI 桥接器 CSR 报头(称为 Type 1 报头)包含主总线、次级总线和下级总线编号寄存器,当主机写入这些寄存器时,可定义桥接器另一侧设备的 CSR 地址。采用 Type 1 CSR 报头的桥接器称为透明桥接器。
Type 0 头部用于端点设备。Type 0 CSR 头部包含基地址寄存器(BAR),用于向主机请求内存或 I/O 地址空间。Type 1 和 Type 0 头部均包含一个类别代码寄存器,用于指示所代表的是何种桥接器或端点,并通过子类别字段、设备 ID 和供应商 ID 寄存器提供更多信息。CSR 头部格式和寻址规则允许处理器搜索 PCI 层级结构的所有分支——从主桥接器向下延伸至每个叶节点——在遍历过程中读取所发现每个设备的类别代码寄存器,并在发现 PCI-to-PCI 桥接器时相应分配总线编号。发现过程完成后,主机即可获知存在哪些设备,以及每个设备正常运行所需的内存和 I/O 空间。这些概念如图 C-0-1 所示。
- 除非另有明确说明,采用 PCI 和 PCI Express 的多处理器系统架构相似,可互换使用。
图 0-1:使用透明桥接器进行枚举
21.3.4 在 PCI Express 基础系统中实现多主机/智能适配器
到目前为止,我们的讨论仅限于单个处理器和单个内存空间。随着技术的进步,系统设计人员开始开发内置本地处理器的端点设备。这导致的问题是,主机处理器和智能适配器在加电或复位时都会尝试枚举整个系统,从而引发系统冲突,最终导致系统无法正常运行。
- 虽然我们以智能端点为例进行说明,但需要注意的是,多主机系统也存在类似的问题。
为解决这一问题,架构师设计了非透明桥接器。非透明 PCI-to-PCI 桥接器(或 PCI Express-to-PCI Express 桥接器)是一种在两侧均暴露 Type 0 CSR 报头的桥接器,通过 BAR(基址寄存器)创建的孔径实现地址转换,将事务从一侧转发至另一侧。由于暴露 Type 0 CSR 报头,该桥接器在发现与配置软件中表现为端点设备,从而消除潜在的发现软件冲突。桥接器两侧的每个 BAR 均创建通往对侧内存空间的隧道或窗口。为促进两侧处理域间的通信,非透明桥接器通常还包含门铃寄存器(用于从桥接器一侧向另一侧发送中断)以及两侧均可访问的暂存寄存器。
非透明桥在功能上与透明桥类似,两者都在两条独立的 PCI 总线(或 PCI Express 链路)之间提供通路。关键区别在于,使用非透明桥时,桥接器下游侧(相对于系统主机)的设备在上游侧不可见。这使得下游侧的智能控制器能够管理其本地域内的设备,同时在上游控制器看来,这些设备仅表现为单一设备。两条总线之间的通路允许下游侧设备直接向上游侧总线传输数据,而无需智能控制器直接参与数据移动。因此,事务处理可像 PCI-to-PCI 桥接器一样无阻碍地跨总线转发,但负责这些资源的设备对主机而言是隐藏的,主机仅看到一个单一设备。
由于我们现在拥有两个内存空间,PCI Express 系统需要翻译从一个内存空间跨越到另一个内存空间的事务地址。这是通过与 BAR 关联的翻译和限制寄存器实现的。详细描述请参见第 958 页的“地址翻译”;第 949 页的图 C-0-2 提供了直接地址翻译的概念性示意图。地址翻译可以通过直接地址翻译(本质上是在掩码下替换数据)、查表或向地址添加偏移量来完成。第 950 页的图 C-0-3 展示了用于在系统内存空间中为本地 I/O 处理器域发起的数据包创建多个窗口的查表翻译,以及用于在相反方向创建单个窗口的直接地址翻译。
图 0-2:直接地址翻译
图 0-3:查表翻译创建多个窗口
21.3.4.1 示例:在 PCI Express 基础系统中实现智能适配器
智能适配器将在 PCI Express 系统中广泛应用,并很可能成为“多处理器”系统中最常见的实例。
第 951 页的图 C-0-4 展示了 PCI Express 系统如何实现智能适配器。该系统架构图包含一个系统主机、一个根复合体(PCI Express 版本的北桥)、一个三端口交换机、一个示例端点以及一个智能插卡。与系统架构类似,该插卡包含一个本地主机、一个根复合体、一个三端口交换机,以及一个
示例端点。然而,我们需注意两个显著差异:智能插件卡包含一个 EEPROM,且交换机的一个端口包含一个背靠背非透明桥接器。
图 0-4:PCI 与 PCI Express 系统中的智能适配器
上电后,系统主机将开始枚举以确定拓扑结构。它将通过根复合体进入第一个交换机(交换机 A)。进入最顶层端口时,主机将看到一个透明桥接器,因此会继续执行枚举操作。随后,主机将轮询最左侧端口,当发现类型 0 CSR 标头时,会将其视为端点,不再深入探索该 PCI 层级分支。接着,主机将利用端点 CSR 标头中的信息,配置桥接器的基址与限制寄存器以及端点的 BAR 寄存器,从而完成该系统分支的内存映射。
主机随后将探测交换机 A 最右侧的端口,并读取与交换机 B 顶部端口关联的 CSR 头部寄存器。由于该端口属于非透明桥接器,主机发现了一个类型 0 的 CSR 头部。因此,主机处理器认为这是一个端点设备,不再沿 PCI 层次结构的该分支进行更深层次的探测。主机读取交换机 B 顶部端口的 BAR 寄存器,以确定桥接器另一侧内存空间窗口所需的内存需求。这些内存空间需求可通过 EEPROM 预加载至交换机 B 非透明端口的 BAR 设置寄存器中,也可在允许系统主机完成发现流程之前,由交换机 B 本地处理器进行配置。
与主机处理器上电序列类似,本地主机也将开始枚举其自身系统。如同系统主机处理器一样,它会为端点分配内存,并在遇到透明桥时继续枚举。当主机到达交换机 B 的最顶层端口时,它会看到一个带有类型 0 CSR 报头的非透明桥。据此,主机读取 CSR 报头的 BAR 以确定内存窗口需求,然后终止其 PCI 树这一分支上的发现过程。同样,内存窗口信息可由 EEPROM 或系统主机提供。
两个处理器域之间的通信通过邮箱系统和门铃中断实现。门铃机制允许每个处理器向另一个处理器发送中断。邮箱机制是一组双端口寄存器,两个处理器均可对其进行读写。通过 BAR 映射的共享内存机制也可用于处理器间通信。
21.3.4.2 示例:在 PCI Express 系统中实现主机故障切换
第 953 页的图 C-0-5 展示了大多数 PCI Express 系统如何实现主机故障切换。图中主机位于左侧,备份宿主机位于右侧。与我们熟悉的多数系统类似,宿主机连接至根复合体,而根复合体将其流量路由至交换机。在此示例中,除已描述的主机上游端口外,交换机还拥有两个连接至端点的端口。此外,该系统还包含另一台处理器,该处理器通过另一个根复合体连接至交换机。
图 0-5:PCI 与 PCI Express 系统中的主机故障切换
连接至两台处理器的交换机端口需可配置为透明桥接模式或非透明桥接模式。可通过交换机的 EEPROM 或配置引脚来初始引导此配置。
在正常运行状态下,上电后主控主机开始枚举系统。在本示例中,当主控主机处理器通过结构体启动其发现协议时,它通过测量两个端点的 BAR(基地址寄存器)大小来发现它们及其内存需求。当到达右上端口时,它会发现一个 Type 0 CSR(配置空间寄存器)头部。这向主控主机处理器表明,它不应尝试在关联的交换机端口远端进行发现。与前一示例类似,与非透明交换机端口关联的 BAR 可能在发现前已通过 EEPROM 加载配置,或由本地处理器上运行的软件进行配置。
同样,与前一示例类似,备份处理器上电后开始枚举。在本示例中,备份处理器芯片组仅包含根复合体和备份处理器。它发现非透明交换机端口后便终止其发现过程。通过 EEPROM 加载的设备 ID 和供应商 ID 寄存器,系统会加载相应的驱动程序。
在正常运行过程中,主处理器在积极管理系统时会执行所有常规任务。此外,它会向备用处理器发送称为心跳消息的信号。心跳消息用于表明发送方处理器持续健康运行。心跳消息可能简单如门铃中断断言,但通常包含一些数据以减少误报的可能性。检查点和日志消息是另一种方法,为备用处理器提供接管时所需的起始点。在日志方法中,备用处理器会获得已完成事务的列表或日志(这里指应用特定意义上的事务,而非总线事务)。在检查点方法中,备用处理器会定期获得完整的系统状态,以便在必要时从中重启。心跳的作用是提供一种机制,使备用处理器能够验证主处理器是否仍在运行。通常,这些数据会包含最新的活动以及所有外设的状态。
如果备份处理器未能及时接收到心跳消息,它将开始接管控制权。其首要任务之一是将主端口降级,以防止故障处理器与系统其他部分交互。这是通过利用非透明端口中 BAR 提供的交换机 CSR 内存映射视图,重新编程交换机的 CSR 来实现的。为了接管控制,备份处理器会反转其端口和主处理器端口的透明/非透明模式,并断开与主处理器的链路。在清理因主机故障而留在队列中或处于未完成状态的任何事务后,备份处理器重新配置系统,使其能够充当主机。最后,它利用检查点或日志消息中的数据重新启动系统。
21.3.4.3 示例:在 PCI Express 基础系统中实现双主机
第 955 页的图 C-0-6 展示了 PCI Express 系统如何实现双主机架构。在该示例中,左侧模块构成一个完整的典型系统,右侧模块则为独立的子系统。如前所述,连接左右两侧图示的是一组非透明桥接器。
图 0-6:PCI 与 PCI Express 系统中的双主机架构
上电后,两个处理器将开始进行枚举操作。与之前相同,主机将通过读取 CSR 来搜索端点,随后分配内存资源。
- 背靠背式非透明(NT)端口并非必要配置,但会因两个主机均采用相同的单板计算机而产生。通常应在两个 NT 端口之间插入透明背板架构。 适当地。当主机在其各自的私有交换机中遇到非透明桥接端口时,它们会将其视为端点,并根据 EEPROM 中的数据分配资源。两个系统将使用上述的门铃和邮箱寄存器相互通信。 双主机系统模型可以通过使用额外的交换机将主机和线路卡双端口连接到冗余结构,扩展为完全冗余的双星系统,如图 C-0-7 第 957 页所示。这对于采用基于机箱的系统以实现灵活性、可扩展性和可靠性的供应商尤其具有吸引力。
图中显示了两块主机卡。主机 A 是结构 A 的主控主机和结构 B 的备用主机。同样,主机 B 是结构 B 的主控主机和结构 A 的备用主机。
每个主机通过透明桥接/交换机端口连接到其服务的结构,并通过非透明桥接/交换机端口连接到仅提供备份的结构。这些非透明端口用于主机间通信,并在地址映射不允许更直接连接时支持跨域对等传输。
图 0-7:双星型结构
21.3.5 总结
通过非透明桥接技术,PCI Express 基础规范为供应商提供了将智能适配器与多主机系统集成到下一代设计中的能力。本附录展示了如何运用 PCI 环境中已采用的行业标准技术来部署这些功能,并说明了它们在不同应用场景中的实际应用方式。基于此,我们可以预见该方法将成为 PCI Express 架构中的行业标准。
21.3.6 地址转换
本节深入描述了使用非透明桥接的系统如何通过地址转换进行通信。我们详细阐述了系统不仅确定分配内存大小的机制,还说明了内存指针的使用方式。同时讨论了基于直接地址转换和查找表地址转换的实现方法。通过将 PCI 架构中广泛采用的非透明桥接标准化实现方式引入 PCI Express 环境,互连供应商能够加速 PCI Express 在需要智能适配器、主机故障切换及多主机功能的市场中的推广进程。
透明桥接器使用 I/O 空间、非预取内存空间和预取内存空间中的基址与限制寄存器,将下游方向的事务映射到桥接器另一端。所有下游设备必须映射在连续的地址区域内,使得每个空间只需单个窗口即可满足需求。上游映射通过相对于相同寄存器的反向解码实现。透明桥接器不会转换转发事务/数据包的地址。
非透明桥接器在其 Type 0 CSR 头部使用标准 BAR 集,定义通往桥接器另一侧内存空间的窗口。共有两组 BAR:一组位于主侧,另一组位于从侧。BAR 定义了资源窗口,允许将事务转发到对侧(另一侧)接口。
对于每个 BAR 桥接器,都存在一组相关的控制和配置寄存器,通常可从桥接器的另一侧进行写入。每个 BAR 都有一个“设置”寄存器,用于定义其窗口的大小和类型,以及一个地址转换寄存器。部分 BAR 还设有限位寄存器,可用于限制其窗口的大小。这些寄存器需要在允许从本地子系统外部访问之前进行编程。通常,这由本地处理器上运行的软件完成,或通过从 EEPROM 加载寄存器来实现。
在 PCI Express 中,通过这些窗口的数据包的事务 ID 字段也会被转换,以支持设备 ID 路由。这些设备 ID 用于将完成信息路由到非发布请求和 ID 路由消息。
透明桥接器根据二级和从属总线号寄存器,将 CSR 事务向下游转发,并根据需要将 Type 1 CSR 转换为 Type 0 CSR。非透明桥接器仅接受发往其自身的 CSR 事务,并对所有其他事务返回不支持请求响应。
21.3.6.1 直接地址转换
所有上游和下游事务的地址均被转换(访问 CSR 的 BAR 除外)。除以下两节所述情况外,从一个接口转发至另一接口的地址,均通过在其所落入 BAR 的偏移量上增加基地址的方式进行转换,如图 C-0-8(第 959 页)所示。BAR 基地址转换寄存器用于为各个 BAR 配置这些基地址转换。
图 0-8:直接地址转换
21.3.6.2 基于查找表的地址转换
遵循 PCI 社区采纳的事实标准,PCI Express 应提供多个基地址寄存器(BAR)用于资源分配。所有 BAR 均包含内存分配;但根据 PCI 行业惯例,BAR 0 包含 CSR 信息,BAR 1 包含 I/O 信息,BAR 2 和 BAR 3 用于基于查找表的地址转换,BAR 4 和 BAR 5 用于直接地址转换。
在从属侧,BAR 3 对落入其窗口范围内的事务使用基于特殊查找表的地址转换(如图 C-0-9 第 960 页所示)。该查找表为从属总线本地地址到主总线地址的映射提供了更高的灵活性。 地址总线中索引字段的位置可通过编程调整,以改变孔径大小。
图 0-9:基于查找表的翻译
21.3.6.3 下游 BAR 限制寄存器
主侧的两个下游 BAR(BAR2/3 和 BAR4/5)也包含限制寄存器,可从本地侧进行编程,以进一步限制它们所暴露窗口的大小,如图 C-0-10(第 961 页)所示。BAR 只能以“2 的幂”粒度分配内存资源。限制寄存器提供了一种方法,通过在“2 的幂”粒度内“封顶”BAR 的大小,从而获得更好的粒度。只有低于限制寄存器的事务才会被转发到次级总线。高于限制的事务将被丢弃,或在读取时返回 0xFFFF_FFFF,或返回等效的主设备中止数据包。
图 0-10:限制寄存器的使用
21.3.6.4 转发64位地址内存事务
某些 BAR 可配置为成对工作,为包含 64 位地址的事务提供基地址和地址转换。命中这些 64 位 BAR 的事务将使用直接地址转换进行转发。与 32 位事务的情况类似,当内存事务从主总线转发到从属总线时,主总线地址可映射到从属总线域中的另一个地址。该映射通过用新基地址替换原始地址的基地址来实现。
桥接器系统侧的 64 位 BAR 对用于将源自桥接器系统侧的 64 位地址窗口转换到本地空间中低于 2^32 的地址范围。
21.4 附录 D:锁定事务
21.4.1 引言
原生 PCI Express 实现不支持旧的锁定协议。对锁定事务序列的支持仅存在于支持在主机处理器上执行锁定 RMW(读取-修改-写入)操作的遗留 PCI 设备软件。本章定义了 PCI Express 为支持针对遗留设备的锁定访问序列而制定的协议。若未能支持锁定功能,可能导致死锁。
21.4.2 背景
PCI Express 仅对遗留设备支持原子性或不可中断的事务序列(通常描述为原子读取-修改-写入序列)。原生 PCIe 设备完全不支持此功能,若收到锁定请求,将返回带有 UR(不支持请求)状态的完成报文。
锁定操作由基本的 RMW 序列组成,即:
- 从目标位置执行一次或多次内存读取以获取数值。
- 处理器寄存器中数据的修改。
- 一次或多次写入操作,将修改后的值写回目标内存位置。
此事务序列必须执行,使得在锁定序列期间不允许其他访问操作访问目标位置(或设备)。这需要在操作期间阻止其他事务,可能导致死锁和性能下降。
需要支持锁定序列的设备包括:
- 根复合体。
- 通往传统设备的路径中,可能成为锁定事务系列目标的任何交换机。
- PCIe 转 PCI 桥接器或 PCIe 转 PCI-X 桥接器。
- 其驱动程序对传统设备内部存储器发出锁定事务的任何传统设备。
在 PCI 环境中,锁定功能通过使用 LOCK# 信号实现。PCIe 中的等效功能则通过使用模拟 LOCK# 信号功能的特定请求来完成。
21.4.3 PCI Express 锁定协议
PCI Express 支持的锁定源仅为通过根复合体(Root Complex)作用的系统处理器。锁定操作在根端口(Root Port)与传统端点(Legacy Endpoint)之间执行。在大多数系统中,传统设备通常是 PCI Express 转 PCI 或 PCI Express 转 PCI-X 桥接器。对于给定的层级路径,每次仅支持一个锁定序列。
锁定事务仅限于使用流量类别 0(Traffic Class 0)和虚拟通道 0(Virtual Channel 0)。映射到非零虚拟通道的其他 TC 值事务允许在不受锁定操作影响的情况下穿越结构,但映射到 VC0 的事务将受此处描述的锁定规则约束。
21.4.3.1 锁定消息 - 虚拟锁定信号
PCI Express 定义了以下事务,它们共同充当虚拟导线,取代了 LOCK# 信号。
内存读取锁定请求(MRdLk)—— 发起锁定序列。首个 MRdLk 事务会阻止 VC0 中的其他请求到达目标设备。在序列期间,可以发出一个或多个此类锁定读取请求。
带数据的内存读取锁定完成(CplDLk)—— 返回数据并确认通往目标的路径已被锁定。为首次内存读取锁定请求返回数据的成功读取完成会导致根复合体与目标设备之间的路径被锁定。也就是说,来自其他端口且经过相同路径的事务将被阻止到达根端口或目标端口。在 VC1-VC7 缓冲区中路由的事务不受锁定影响。
无数据的内存读取锁定完成(CplLk)——无数据负载的完成表示锁定序列当前无法完成,路径仍处于解锁状态。
解锁消息—— 解锁消息由根复合体从锁定的根端口发出。该消息用于解锁根端口与目标端口之间的路径。
21.4.3.2 锁定协议序列示例
本节通过示例解释 PCI Express 锁定协议。该示例包含以下设备:
- 代表主机处理器发起锁定事务序列的根复合体。
- 位于根端口与目标传统端点之间路径上的交换机。
- 位于通往目标路径上的 PCI Express 转 PCI 桥接器。
- 发起锁定 RMW 的目标 PCI 设备的设备驱动程序。
- 包含一个 PCI Express 端点,用于描述锁定期间交换机的行为。
在此示例中,锁定操作正常完成。操作期间发生的步骤将在以下两个部分中描述。
21.4.3.2.1 内存读取锁定操作
图 E-1(第 967 页)展示了锁定事务序列的第一步(即获取信号量的初始内存读取):
- CPU 因驱动程序执行针对 PCI 目标的锁定 RMW 指令而启动锁定序列(锁定内存读取)。
- 根端口从端口2发出内存读取锁定请求。根复合体始终是锁定序列的发起方。
- 交换机在其上行端口接收锁定请求,并将该请求转发至目标出口端口(3)。交换机在将请求转发至出口端口时,必须阻止除入口端口(1)之外的所有端口发出的请求从该出口端口发送。
- 从图示的 PCI Express 端点向 PCI 总线(交换端口 2 到交换端口 3)发起的后续点对点传输将被阻止,直到锁被清除。请注意,锁尚未在另一方向上建立。来自 PCI Express 端点的事务可以发送到根复合体。
- 内存读取锁定请求从交换机的出口端口发送到 PCI Express 转 PCI 桥接器。该桥接器将实现 PCI 锁定语义(有关 PCI 锁定的详细信息,请参阅 MindShare 出版的《PCI 系统架构,第四版》)。
- 桥接器在 PCI 总线上执行内存读取事务,并置位 PCI LOCK# 信号。目标内存设备将请求的信号量数据返回给桥接器。
- 读取数据返回给桥接器,并通过带数据的内存读取锁定完成(CplDLk)传递回交换机。
- 该交换机使用 ID 路由将数据包向上游返回至主机处理器。当 CplDLk 数据包被转发至交换机的上游端口时,它会在上游方向建立锁定,以防止来自其他端口的流量被路由至上游。PCI Express 端点被完全阻止通过锁定操作的路径向交换机端口发送任何事务。需要注意的是,未参与锁定操作的交换机端口之间的传输将被允许(本示例中未显示)。
- 根复合体在检测到 CplDLk 数据包后,便知晓锁定已在其与目标设备之间的路径上建立,随后完成数据被发送至 CPU。
图 D-1:锁定序列以内存读取锁定请求开始
21.4.3.2.2 读取数据已修改并写入目标,锁定完成
设备驱动程序接收信号量值,对其进行修改,然后发起内存写入操作,以更新传统 PCI 设备内存中的信号量。第 969 页的图 E-2 展示了写入序列,随后是
根复合体发送解锁消息以释放锁定的过程:
- 根复合体通过锁定路径向目标设备发出内存写入请求。
- 交换机将事务转发至目标出口端口(3)。内存写入操作的内存地址必须与初始内存读取请求的地址保持一致。
- 桥接器将事务转发至 PCI 总线。
- 目标设备接收内存写入数据。
- 当内存写入事务从根复合体发出后,根复合体会发送解锁消息,指示锁定路径上的交换机和所有 PCI/PCI-X 桥接器释放锁定。请注意,根复合体假定操作已正常完成(因为内存写入采用发布机制,且无需返回完成报文验证成功)。
- 交换机接收到解锁消息后,解锁其端口,并将该消息转发至之前被锁定的出口端口,以通知锁定路径中的其他交换机和/或网桥必须清除锁定。
- 网桥在检测到解锁消息后,还必须释放对 PCI 总线的锁定。
图 D-2:锁定完成,内存写入后跟随解锁消息
21.4.3.3 锁定失败的通知
当初始的内存读取锁定请求收到一个无数据的完成包(CplLk)时,锁定的事务序列将被中止。这意味着由于未返回数据,锁定序列必须终止。这可能是由内存读取事务相关的错误引起的,或者目标设备正忙,暂时无法响应。
21.4.4 锁定规则总结
以下是适用于根复合体、交换机和桥接器的排序规则列表。
21.4.4.1 与锁定事务的发起和传播相关的规则
- 锁定请求若以非“成功完成”状态结束,则不会建立锁定。
- 无论与锁定序列关联的任何完成状态如何,所有锁定序列及尝试中的锁定序列都必须通过发送解锁消息来终止。
- MRdLk、CplDLk 及解锁语义仅允许用于默认流量类别(TC0)。
- 在单个层级域内,同一时间只能有一个锁定事务序列尝试处于进行中状态。
- 任何未参与锁定序列的设备必须忽略解锁消息。
通过 PCI Express 结构发起和传播锁定事务序列的过程如下:
锁定事务序列以 MRdLk 请求开始:
与锁定事务序列相关的任何后续读取也必须使用 MRdLk 请求。
任何成功的 MRdLk 请求的完成操作均使用 CplDLk 完成类型,而不成功的请求则使用 CplLk 完成类型。
如果与锁定序列相关的任何读取操作未能成功完成,请求者必须假定锁的原子性不再得到保证,并且请求者与完成者之间的路径不再处于锁定状态。
与锁定序列相关的所有写入操作必须使用 MWr 请求。
解锁消息用于指示锁定序列的结束。交换机通过锁定的出口端口传播解锁消息。
接收到解锁消息后,传统端点或桥接器若处于锁定状态,则必须自行解锁。若其未处于锁定状态,或接收方为不支持锁定的 PCI Express 端点或桥接器,则解锁消息将被忽略并丢弃。
21.4.4.2 与交换机相关的规则
交换机必须将锁定序列相关的事务与其他事务区分开来,以防止其他事务干扰锁定并可能导致死锁。以下规则说明了具体实现方式。请注意,锁定访问仅限于 TC0,而 TC0 始终映射至 VC0。
- 当交换机将 MRdLk 请求从入端口传播到出端口时,必须阻止所有映射到默认虚拟通道(VC0)的请求传播到出端口。如果在此入端口接收到针对不同出端口的后续 MRdLk 请求,交换机的行为将未定义。请注意,PCI Express 不支持这种分裂锁定访问,软件不得引发此类锁定访问。此类访问可能导致系统死锁。
- 当第一个 MRdLk 请求的 CplDLk 返回时,如果完成状态指示成功完成,则交换机必须阻止来自所有其他端口的请求传播到参与锁定访问的两个端口,但映射到出端口上 VC0 以外通道的请求除外。
- 参与锁定序列的两个端口必须保持阻塞状态,直到交换机(在接收到初始 MRdLk 请求的入端口处)收到解锁消息。
- 解锁消息必须转发到被锁定的出端口。
- 解锁消息可广播至所有其他端口。
- 当解锁消息到达时,入口端口解除阻塞;而被阻塞的出口端口则在解锁消息从出口端口传输完成后解除阻塞。未参与锁定访问的端口不受解锁消息影响。
21.4.4.3 与 PCI Express/PCI 桥接器相关的规则
PCI Express/PCI 桥接器的要求与交换机类似,但由于这些桥接器仅使用 TC0 和 VC0,因此在锁定访问期间所有其他流量均被阻塞。PCI 总线侧的要求详见 MindShare 著作《PCI 系统架构(第四版)》。
21.4.4.4 与根复合体相关的规则
根复合体允许作为请求者支持锁定事务。如果支持锁定事务,根复合体必须遵循已描述的规则来执行锁定访问。根复合体用于连接主机处理器 FSB(Front Side Bus,前端总线)的机制不在本规范范围内。
21.4.4.5 与传统端点相关的规则
传统端点允许支持锁定访问,尽管不鼓励使用。如果支持锁定访问,传统端点必须按以下方式处理:
- 传统端点在其为锁定事务系列访问的第一个读取请求传输第一个完成状态为“成功完成”的完成消息时,即进入锁定状态:
- 若完成状态并非“成功完成”,则传统端点不会进入锁定状态。
- 一旦锁定,传统端点必须保持锁定状态,直至收到解锁消息。
- 在锁定期间,传统端点不得使用映射到默认虚拟通道(VC0)的流量类别发起任何请求。请注意,此要求适用于端点内所有可能的请求源(若存在多个请求源的情况)。允许使用映射到非 VC0 虚拟通道的流量类别发起请求。
21.4.4.6 与 PCI Express 端点相关的规则
原生 PCI Express 端点不支持锁定。PCI Express 端点必须将 MRdLk 请求视为不支持的请求。